/**
 *@file
 *File contenente le funzioni per l'inserimento e la stampa dei nomi e punteggi più alti
 */

#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <iostream>
#include <fstream>
#include <allegro5/allegro_ttf.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
#include <allegro5/allegro_native_dialog.h>

using namespace std;

#include "struttura_dati.h"
#include "gestione_record.h"
#include "sn_main.h"




/** 
 * Salva su file i 10 punteggi migliori(con i rispettivi nomi).
 * Funzione privata invocata da ::inserisci_in_ordine
 * Se il numero di elementi è <10 viene passato il numero di elementi, altrimenti 10
 * in modo che il punteggio più basso non viene salvato ne successivamente verrà caricato
 * @param[in] lista oggetto di tipo l_record contenente nomi e punteggi da salvare su file
 */

 
void salva_lista(const l_record & lista){
	/* apro uno streamfile in output*/
	ofstream f2("l_record.txt");
	if(!f2){
		al_show_native_message_box(display,"Errore", "Errore riscontrato:",
	  	"Impossibile aprire/crere file contente record",NULL,ALLEGRO_MESSAGEBOX_ERROR);
		dealloca_oggetti();
		delete[] lista.elementi;
		exit(1);}
	
	f2<<lista.num_elem<<endl;
	
	assert(lista.num_elem<=top_ten);
	for(int i=0; i<lista.num_elem;i++){
		f2<<lista.elementi[i].score<<"\t";
		f2<<lista.elementi[i].nome<<endl;
	}
}






			
bool carica_lista(l_record & lista, bool da_menu){
	/* apro uno streamfile in input*/
	ifstream f("l_record.txt");
	if(!f){
		al_show_native_message_box(display,"Errore", "Errore riscontrato:",
	  	"Impossibile aprire file contente record",NULL,ALLEGRO_MESSAGEBOX_ERROR);
		dealloca_oggetti();
		exit(1);}
	
	
	/* Carico da file il numero di elementi presenti in lista.
	 * In caso di lista vuota prenderà 0.
	 */	
	f>>lista.num_elem;
	assert(lista.num_elem>=0 && lista.num_elem<=top_ten);
	if(da_menu){
		if(lista.num_elem == 0){
			al_draw_text(ysel,al_map_rgb(255,127,50),400,240,ALLEGRO_ALIGN_CENTRE,"-lista record vuota-");
			f.close();
			return false;}
		int pti;
		char name[MAX_NOME];
		for(int i=0;i<lista.num_elem;i++){
			f>>pti>>name;
			al_draw_textf(nsel,al_map_rgb(255,127,50),150,i*60,0,"%i",pti);
			al_draw_text(nsel,al_map_rgb(255,127,50),300,i*60,0,name);}
		}
	else{
				
		/* alloco in memoria un array dinamico di dimensione num_elementi+1,
	 	 * questo per memorizzare il nuovo elemento in ingresso.
     	 */ 
		lista.elementi=new elem[lista.num_elem+1];
	
		/*Se presenti, carico tutti gli elementi in lista */
		for(int i=0;i<lista.num_elem;i++){
			f>>lista.elementi[i].score;
			f>>lista.elementi[i].nome;}
	}
	/*chiudo lo streamfile*/	
	f.close();	
return true;
}
			 


void inserisci_in_ordine(l_record &lista, int miei_punti, const char *mionome){
	assert(lista.num_elem>=0);
	int i=0;	
	while(i<lista.num_elem && lista.elementi[i].score>miei_punti) i++;	
	
	for(int j=lista.num_elem; j>i;j--){
		assert(j>0);
		lista.elementi[j]=lista.elementi[j-1];}
	
	/* inserisco elemento e aggiorno la variabile contatore(num_elem) */
	lista.elementi[i].score=miei_punti;	
	strcpy(lista.elementi[i].nome,mionome);
	
	/*Se la lista ha gia 10 elementi, non incremento il contatore
	 *in modo da salvare solo i 10 punteggi più alti e scartare il più basso
	 */
	if(lista.num_elem<top_ten) lista.num_elem++;  	
	/*chiamo la funzione per salvare i punteggi e nomi in un file di testo*/	
	salva_lista(lista);
	
	/*dealloco la lista*/
	delete[] lista.elementi; 


}



